"""
______________________________
time：2021/7/6
______________________________

"""
"""执行时别忘记先把ATX删除"""
from time import sleep

from appium import webdriver
from appium.webdriver.common.mobileby import MobileBy
from appium.webdriver.common.touch_action import TouchAction
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 在安卓7.1.2上面打开销帮帮CRM应用
desired_caps = {
    "automationName": "UiAutomator2",
    "platformName": "Android",
    "platformVersion": "7.1.2",
    "deviceName": "Oppo_phone",
    "appPackage": "io.dcloud.xbb.ent",  # 通过包名绑定对应app
    "appActivity": "io.dcloud.PandoraEntryActivity",  # app自动化测试的好处不用登陆，直接设置好页面就不用次次登录；
    "noReset": True
}
# 跟appium建立连接然后把启动参数发给它
driver = webdriver.Remote(
    command_executor="http://127.0.0.1:4723/wd/hub", desired_capabilities=desired_caps)
sleep(1)

# 等待
# loc1 = (MobileBy.XPATH, "d.xpath('//android.widget.EditText')")
# wait = WebDriverWait(driver, 10).until(EC.visibility_of_element_located(loc1))
# element = driver.find_element(*loc1).send_keys("13646841329")  # 获取手机号输入框
# sleep()
# driver.quit()

"""
app特有的操作：
滑动 触屏操作 多点触控 滚动条 
h5混合应用：html、微信小程序|小程序
toast处理
"""

# driver.find_element_by_accessibility_id()

"""
滑动操作：通过TouchAction类实现——操作+执行(perform)
操作有3个参数：元素对象、x、y[两种方式二选一，可以选择用元素对象进行操作，也可以用坐标进行操作]
tap点击
press按住
long_press长按
wait等待
move_to移动
release释放

并不知道要找的元素处在哪一屏怎么办？
滑动一屏找一屏，滑动一屏，进入新页面，在新的页面中查找元素；
找到元素了，不再滑动屏幕；没找到就继续滑到新的页面。
如果滑到底部还没找到元素，则不再滑动屏幕；

如何判断是当前屏幕的下一屏幕呢？driver.page_source获取当前页面源码
old——历史页面 初始值为：None
new——当前新页面 初始值：driver.page_source
如果我执行了滑动操作则：
old=new
new=driver.page_source

如何判断是否滑动到底部：
if old=new ，则滑动到底部
"""

# _______滑动操作____________上下滑动、左右滑动类似的，只是坐标不同
size = driver.get_window_size()  # 设备大小
x = size["width"] * 0.5
y_start = size["height"] * 0.6
y_end = size["height"] * 0.5
# ta = TouchAction(driver)  # 实例化
# ta.press(x=x, y=y_start).wait(200).move_to(x=x, y=y_end).release()  # 触屏动作
# ta.perform()  # 执行触屏操作
# driver.swipe(x, y_start, x, y_end, 200)  # 通过swipe实现触屏操作，就是上面代码的封装


# _______列表滑动流程____________

loc = (MobileBy.ANDROID_UIAUTOMATOR, '//*[@text="查看业绩详情"]')  # 要找的元素
old = None
new = driver.page_source

while old != new:
    # 查找元素——没有找到元素或等待失败，抛出异常
    try:
        WebDriverWait(driver, 2).until(EC.visibility_of_element_located(loc))
    except:  # 没找到继续滑动下一屏幕
        driver.swipe(x, y_start, x, y_end, 200)  # 通过swipe实现触屏操作
        sleep(0.5)
        old = new  # 更新新旧页面
        new = driver.page_source
    else:  # 找到该元素后break
        element = driver.find_element(*loc).click()  # 点击跳转
        break


